package com.jsj.bs.controller;

import com.github.pagehelper.PageInfo;
import com.jsj.bs.pojo.Result;
import com.jsj.bs.pojo.TbAdmin;
import com.jsj.bs.service.TbAdminService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

/**
 * (TbAdmin)表控制层
 *
 * @author makejava
 * @since 2019-12-31 18:53:55
 */
@Controller
@RequestMapping("/tbAdmin")
public class TbAdminController {
    /**
     * log4j2日志管理
     */
    private static final Logger LOGGER = LogManager.getLogger(TbLeaderController.class);

    /**
     * 返回的结果集 自定义
     */
    private static final Result resultMsg = new Result();


    /**
     * 服务对象
     */
    @Autowired
    private TbAdminService tbAdminService;

    /**
     * 管理员管理 管理员登陆
     *
     * @param tbAdmin 实体对象
     * @return 指定页面
     */
    @RequestMapping("/login-admin")
    public String loginAdmin(TbAdmin tbAdmin, HttpSession session, Model model) {
        //账号
        String account = tbAdmin.getAdminAccount();
        //密码
        String password = tbAdmin.getAdminPassword();
        LOGGER.info(account + "===============" + password);
        //3、得到Subject及创建用户名/密码身份验证Token（即用户身份/凭证）
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(account, password);
        try {
            //4、登录，即身份验证
            subject.login(token);
            if (subject.isAuthenticated()) {
                Boolean status = tbAdminService.queryStatus(account);
                if (!status && subject.hasRole("admin")) {
                    session.setAttribute("account", account);
                    session.setAttribute("hasRole", "hasAdmin");
                    //start   此处是用来判断用户和负责人第一次修改密码成功的判断
                    session.setAttribute("addLeaderStatus2", "002");
                    //end
                    return "redirect:/main";
                }
                session.setAttribute("msg", "当前账户异常，请联系超级管理员"+status);
                return "redirect:/error";
            }
        } catch (AuthenticationException e) {
            //5、身份验证失败
            e.printStackTrace();
        }
        session.setAttribute("msg", "账户或密码错误");
        return "redirect:/error";
    }

    /**
     * 管理员管理 添加管理员
     *
     * @param tbAdmin 管理员实体对象
     * @param model 存储数据的容器
     * @return 指定页面
     */
    @RequestMapping(value = "/addAdmin", method = RequestMethod.POST)
    public String addAdmin(TbAdmin tbAdmin, Model model) {
        LOGGER.info("======addAdmin===="+tbAdmin);
        //先判断管理员是否存在  账号唯一
        TbAdmin admin = tbAdminService.queryByAccountAdmin(tbAdmin.getAdminAccount());
        //如果为空
        if (admin == null) {
            //添加用户角色
            tbAdmin.setRoleId(1);
            //获取账户密码
            String password = tbAdmin.getAdminPassword();
            //使用MD5加密 第一个参数--加密的字符串  第二个参数---盐值  第三个参数---加盐次数 即散列次数
            password = new Md5Hash(password, tbAdmin.getAdminAccount(), 1024).toString();
            //将加密后的密码添加到TbAdmin实体对象中
            tbAdmin.setAdminPassword(password);
            //用户不存在，可以添加
            TbAdmin insert = tbAdminService.insert(tbAdmin);
            //返回 1 成功  0 失败
            LOGGER.info("=======添加用户的信息===="+insert);
            if (insert != null){
                model.addAttribute("StatusMsg", 9);
                return "updateresult";
            }
        }
        model.addAttribute("StatusMsg", 10);
        return "updateresult";
    }
    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @RequestMapping("/selectOne")
    @ResponseBody
    public TbAdmin selectOne(Integer id) {
        return tbAdminService.queryById(id);
    }


    /**
     * 查询多条数据
     * @param page 页码
     * @param pageSize 页大小
     * @param tbAdmin 实体
     * @return PageInfo<TbAdmin> 分页数据集合
     */
    @RequestMapping("/searchAll")
    @ResponseBody
    public PageInfo<TbAdmin> searchAll(@RequestParam(value = "page",defaultValue = "1") int page, @RequestParam(value = "pageSize",defaultValue = "5")int pageSize, TbAdmin tbAdmin){
        return tbAdminService.queryAll(page, pageSize, tbAdmin);
    }
    /**
     * 管理员管理 查询所有用户信息
     *
     * @param page
     * @param pageSize
     * @param tbAdmin
     * @param model
     * @return
     */
    @RequestMapping(value = "/searchAdmins", method = RequestMethod.GET)
    public String searchAdmins(@RequestParam(value = "page", defaultValue = "1") Integer page,
                               @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
                               TbAdmin tbAdmin, Model model) {

        PageInfo<TbAdmin> tbAdminPageInfo = tbAdminService.queryAll(page, pageSize, tbAdmin);
        LOGGER.info("========tbAdminPageInfo=="+tbAdminPageInfo);
        for (TbAdmin o : tbAdminPageInfo.getList()) {
            LOGGER.info(o);
        }
        //将获取的数据存到model，以便jsp页面获取
        model.addAttribute("tbAdminPageInfo",tbAdminPageInfo );
        return "admin-manager";
    }

    /**
     * 管理员管理 更新状态
     *
     * @param tbAdmin 管理员实体对象
     * @return
     */
    @RequestMapping(value = "/updateStatus", method = RequestMethod.POST)
    @ResponseBody
    public Result updateStatus(TbAdmin tbAdmin) {
        LOGGER.info("=======/tbAdmin/updateStatus======" + tbAdmin.getAdminId());
        Boolean result = tbAdminService.updateOk(tbAdmin);
        if (result) {
            resultMsg.setFlag(true);
            resultMsg.setMsg("操作成功");
        } else {
            resultMsg.setFlag(false);
            resultMsg.setMsg("操作失败");
        }
        return resultMsg;
    }

}